package com.day12;

/**
 * 接口的使用
 * 1.接口的使用interface来定义
 * 2.在java中，接口和类是并列的两个结构
 * 3.如何定义接口，定义接口中的成员
 * 3.1 jdk7以及以前:只能定义全局常量和抽象方法
 * >全局常量:public static final 的，书写时可以指定不写，但是也在
 * >抽象方法:public abstract的
 * <p>
 * 3.2 jdk8:除了定义全局常量和抽象方法，还可以定义静态方法，默认方法
 * <p>
 * 4.接口是不能定义构造器的,意味着接口不可以实例化。
 * <p>
 * 5.java开发中，类去实现接口，必须实现所有的抽象方法,通过implements的方式来使用
 * 如果实现类覆盖了接口中所有的抽象方法，则此实现类就可以实例化
 * 如果实现类没有覆盖接口中所有的抽象方法，则此实现类仍为一个抽象类。
 * <p>
 * <p>
 * 6.java类可以实现多个接口--->弥补了java单继承的局限性
 */
public class InterfaceTest {

    public static void main(String[] args) {
        System.out.println(Flyable.MAX_SPEED);

        //接口中的默认方法，可以通过实现类的实例化去调用
        SubClass subClass = new SubClass();
        subClass.method();
        subClass.method1();
        //接口中定义的静态方法只能通过接口去掉
        Flyable.attack();

    }

}


interface Flyable {

    //全局常量
    public static final int MAX_SPEED = 7900; //第一宇宙速度

    //抽象方法
    public abstract void fly();

    public static void attack() {

        System.out.println("Compare:北京");
    }

    public default void method(){
        System.out.println("上海");
    }

    default void method1(){
        System.out.println("默认方法");
    }

    //省略abstract
    void demo();

//    public Flyable() {
//
//    }

}


interface RunTable extends Flyable {
    public void demo1();
}

class Plane extends Object implements Flyable, RunTable {

    @Override
    public void fly() {

    }

    @Override
    public void demo() {

    }

    @Override
    public void demo1() {

    }
}

class SubClass implements Flyable{


    @Override
    public void fly() {

    }

    @Override
    public void demo() {

    }

    //可以使用super关键字调用接口的方法
    public void help(){
        Flyable.super.method();
    }
}
